/*****************************************
**  Nom : SALINAS        				**
**	Nom du fichier : ChngAvt.c			**
**	Description : Gestion du chainage 	**
**			      avant					**
**				  						**
**										**
**										**
**	Date : 14/08/2014				    **
**  Statut : Release					**
*****************************************/

/*****************************************
**  Zone de declaration des includes    **
*****************************************/

 #include "struct.h"

/**************************************************
**  [Fonction ChainageAvant]                     **
**    Lance toutes les fonctions ci-dessous      **
**************************************************/
int ChngAvt_ChainageAvant(ST_RES* Tete_Res, ST_FAITS* Tete_Faits,char* mask)
{
	ST_FAITS *Fcourant=Tete_Faits;
	int Nb_chain=0;
	int FlagTape=-2;					// Permet de savoir quand il faut taper et combien de conditions de tapes sont remplies !
	#warning (MAT) -2 a mieux definir ... correspond au 2 validation du fichier de fait config ( pre separateur )
 
	while(Fcourant!=NULL)
	{
		ChngAvt_ParcoursResultats(Fcourant->fait,Tete_Res,Nb_chain);
		ChngAvt_BoucleValidation(Tete_Res, Tete_Faits,&FlagTape,mask);
		Fcourant=Fcourant->suiv;
		Nb_chain++;
	}
	//printf("Le flag est a <%d>\n",FlagTape);
	return FlagTape;
}


/******************************************************
**  [Fonction ParcoursConditions]                    **
**    Parcours la liste chainée des conditions pour  **
**    un résultat donné et cherche les maillons      **
**    correspondant au fait "actuel"                 **
******************************************************/
void ChngAvt_ParcoursConditions(char *str, ST_RES *res,ST_COND *pt_Tete)
{
	ST_COND *courant=pt_Tete;
	while(courant != NULL)
	{	
		
		if(!strcmp(str,courant->cond))
		{
			//printf("-----<%s> trouvé : <%s>-----\n",str,courant->cond);
			ChngAvt_ValideCondition(res,courant);
		}
		else
		{
			//printf("-----<%s> non trouvé : <%s>-----\n",str,courant->cond);
			courant->valid=FALSE;
		}
		courant = courant->suiv;
	}
}


/**************************************************
**  [Fonction ValideCondition]                   **
**    Valide la condition si celle-ci est dans   **
**    les faits                                  **
**************************************************/
void ChngAvt_ValideCondition(ST_RES *resultat,ST_COND *condition)
{
	condition->valid=TRUE;
	resultat->nb_cond_valid = resultat->nb_cond_valid + 1;
}

/******************************************************
**  [Fonction ParcoursResultats]                     **
**    Parcours la liste chainée des resultats pour   **
**    chercher le(s) maillon(s) correspondant au     **
**    fait "actuel"                                  **
******************************************************/
void ChngAvt_ParcoursResultats(char *str, ST_RES *pt_Tete,int Nb_chain)
{
	ST_RES *courant=pt_Tete;
	while(courant != NULL)
	{
		if(Nb_chain == 0)
		{
			courant->nb_cond_valid =0;
			courant->valid = FALSE;
		}
		if(!strcmp(str,courant->res))
		{
			//printf("-----<%s> trouvé : <%s>-----\n",str,courant->res);
			ChngAvt_ValideResultat(courant);
		}
		ChngAvt_ParcoursConditions(str,courant,courant->TeteListCond);
		courant = courant->suiv;
	}
}


/**************************************************
**  [Fonction ValideResultat]                    **
**    Valide le resultat si celui-ci est dans    **
**    les faits                                  **
**************************************************/
void ChngAvt_ValideResultat(ST_RES *resultat)
{
	resultat->valid=TRUE;
}

/**************************************************
**  [Fonction BoucleValidation]                  **
**    Valide les resultats dont toutes les       **
**    conditions ont été validées                **
**************************************************/
void ChngAvt_BoucleValidation(ST_RES* Tete_Res, ST_FAITS* Tete_Faits,int *FlagTape,char* mask)
{
	ST_RES *courant=Tete_Res;
	
	while(courant != NULL)
	{
		if(courant->valid==FALSE)
		{
			if(courant->nb_cond_valid == courant->nb_cond)
			{
				ChngAvt_ValideResultat(courant);
				if(ChainArr_VerifBut(courant->res,Tete_Res,Tete_Faits)== 1)
				{
					/*printf("Rajout du maillon %s\n",courant->res);
					Tete_Faits=CreerListeCh_Creer_MaillonFaits(Tete_Faits,courant->res);
					*FlagTape=*FlagTape+1;
					printf("Le 1er flag est a <%d>\n",*FlagTape);*/
					
					
					// CHAR -> 8 Bits 	0000 0000
					//                  xxxx xxx1 -> Tapage
					//					0001 0000 -> Valet
					//					0010 0000 -> Dame :) 
					//                  0100 0000 -> King !
					//					1000 0000 -> L'AASSSSS
					
					printf("La regle <%s> est validé\n",courant->res);
					if(!strncmp(courant->res,"P",1))
					{
						*mask |= 0x01;		
					}
					if(!strncmp(courant->res,"SW",2))
					{
						*mask |= 0x01;
					}
					if(!strncmp(courant->res,"SD",2))
					{
						*mask |= 0x01;
					}
					if(!strcmp(courant->res,"4_C"))
					{
						*mask |= 0x80;
					}
					if(!strcmp(courant->res,"3_C"))
					{
						*mask |= 0x40;
					}
					if(!strcmp(courant->res,"2_C"))
					{
						*mask |= 0x20;
					}
					if(!strcmp(courant->res,"1_C"))
					{
						*mask |= 0x10;
					}
					*FlagTape=*FlagTape+1;
				}
			}
		}
		courant = courant->suiv;
	}
}
